package com.chenjiajin.controller;

import com.chenjiajin.domain.Demo;
import com.chenjiajin.domain.Logtest;
import com.chenjiajin.feign.FeignService;
import feign.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;

/**
 * 调用方
 */
@RestController
public class SonController {

    @Autowired
    private Demo demo;

    @Autowired
    private FeignService feignService;

    /**
     * 测试接口
     */
    @RequestMapping("/demo")
    public String aop(String test) {      // http://localhost:90/aop
        System.out.println("这是demo方法");
        System.err.println("demo = " + demo);
        return "demo";
    }


    /**
     * 参数 String
     * 返回值 String
     */
    @RequestMapping("/string")
    public String string(String string) {
        // http://localhost:90/string?string=abc
        return feignService.string("string");
    }


    /**
     * 参数 String
     * 返回值 String
     */
    @RequestMapping("/doubleString")
    public String doubleString(@RequestParam String string, @RequestParam String name) {
        // http://localhost:90/doubleString?string=abc&name=name
        return feignService.doubleString(string, name);
    }


    /**
     * 参数 JavaBean
     * 返回值 JavaBean
     */
    @RequestMapping("/feign1")
    public Logtest feign1() {
        // http://localhost:90/feign
        Logtest logtest = feignService.feign1(new Logtest("1111", "2222", "3333", "4444"));
        return logtest;
    }

    /**
     * 参数 Map<String, JavaBean>
     * 返回值 JavaBean
     */
    @RequestMapping("/feign2")
    public Logtest feign2() {
        Map<String, Logtest> map = new HashMap<>();
        map.put("1", new Logtest("1111", "1111", "1111", "1111"));
        map.put("2", new Logtest("2222", "2222", "2222", "2222"));
        map.put("3", new Logtest("3333", "3333", "3333", "3333"));
        map.put("4", new Logtest("4444", "4444", "4444", "4444"));
        Logtest logtest = feignService.feign2(map);
        return logtest;
    }

    /**
     * 参数 Map<String,String>
     * 返回值 JavaBean
     */
    @RequestMapping("/feign3")
    public Logtest feign3() {
        Map<String, String> map = new HashMap<>();
        map.put("1", "1111");
        map.put("2", "2222");
        map.put("3", "3333");
        map.put("4", "4444");
        Logtest logtest = feignService.feign3(map);
        return logtest;
    }


    /**
     * 参数 JavaBean
     * 返回值 Map<String,String>
     */
    @RequestMapping("/feign4")
    public Map<String, String> feign4() {
        Logtest logtest = new Logtest("1111", "2222", "3333", "4444");
        Map<String, String> map = feignService.feign4(logtest);
        return map;
    }


    /**
     * 参数 JavaBean
     * 返回值 Map<String,JavaBean>
     */
    @RequestMapping("/feign5")
    public Map<String, Logtest> feign5() {
        Logtest logtest = new Logtest("1111", "2222", "3333", "4444");
        Map<String, Logtest> map = feignService.feign5(logtest);
        Logtest logtest1 = map.get("1");
        System.err.println(logtest1);
        return map;
    }


    /**
     * 参数 JavaBean
     * 返回值 List<String>
     */
    @RequestMapping("/feign6")
    public List<String> feign6() {
        Logtest logtest = new Logtest("1111", "2222", "3333", "4444");
        List<String> list = feignService.feign6(logtest);
        return list;
    }


    /**
     * 参数 JavaBean
     * 返回值 List<JavaBean>
     */
    @RequestMapping("/feign7")
    public List<Logtest> feign7() {
        Logtest logtest = new Logtest("1111", "2222", "3333", "4444");
        List<Logtest> list = feignService.feign7(logtest);
        Logtest logtest1 = list.get(0);
        System.err.println(logtest1);
        return list;
    }

    /**
     * 参数 List<JavaBean>
     * 返回值 List<JavaBean>
     */
    @RequestMapping("/feign8")
    public List<Logtest> feign8() {
        List<Logtest> list = new ArrayList<>();
        list.add(new Logtest("1111", "1111", "1111", "1111"));
        list.add(new Logtest("2222", "2222", "2222", "2222"));
        list.add(new Logtest("3333", "3333", "3333", "3333"));

        List<Logtest> list2 = feignService.feign8(list);
        Logtest logtest1 = list2.get(0);
        System.err.println(logtest1);
        return list2;
    }


    /**
     * 测试Bug
     * 远程接口传递的参数为null时的异常
     */
    @RequestMapping("/testBug")
    public String testBug(Long i) {
        // http://localhost:90/testBug?i=1
        String result = feignService.testBug(i);
        System.err.println(result);
        return result;
    }

    /**
     * 测试Bug
     * 超时时间默认1秒
     */
    @RequestMapping("/testTime")
    public String testTime() {
        // http://localhost:90/testTime
        String result = feignService.testTime();
        System.err.println(result);
        return result;
    }

    /**
     * 远程调用 文件下载
     */
    @RequestMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        response.setContentType("application/pdf");
        response.setCharacterEncoding("UTF-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("箱唛.pdf", "UTF-8"));
        OutputStream outputStream = response.getOutputStream();

        Response serviceResponse = feignService.download("aaa");
        InputStream inputStream = serviceResponse.body().asInputStream();

        FileCopyUtils.copy(inputStream, outputStream);


    }



    //注意：如果存在时间为DATE类型的字段的时候，调用方需要使用String来接收该时间字段

    //如果你的时间存在时差问题。那是因为：
    //Feign客户端在进行通信时，会将Date类型对象转为String类型，
    // 如果这个时间是北京时间2019年2月19日20点30分，因为中国的时区叫做CTS，所以转化后的String为“Tue Feb 19 20:30:00 CST 2019”.
    // 服务端将接收的String类型日期转换为Date类型，转换采用的是Date的默认构造器new Date(‘Tue Feb 19 20:30:00 CST 2019’)，
    // 这里就是错误发生的时刻，
    // 因为CTS代表的时区其实有四个（Central Standard Time (USA) UT-6:00、Central Standard Time (Australia) UT+9:30、China Standard Time UT+8:00、Cuba Standard Time UT-4:00），
    // 同时表示美国，澳大利亚，中国，古巴四个国家的标准时间。
    // 根据JavaDoc，jvm会将CTS理解成了美国中部时区，因此造成了时区错误。


    /**
     * Date格式传输 post方式 使用RequestBody注解
     */
    @RequestMapping("/feign9")
    public void feign9() {
        // http://localhost:90/feign9
        Date date = feignService.feign9(new Date());
        System.err.println(date.toLocaleString());
    }

    // 下面说说两种解决方案
    // 1.当发送时间类型时，直接用String发送（推荐）
    // 2.Feign客户端实现FeignFormatterRegistrar接口自定义DateFormatRegister




    @RequestMapping("/feign10")
    public void feign10() {
        // http://localhost:90/feign10
        Logtest logtest1 = new Logtest("1111", "2222", "3333", "4444");
        logtest1.setDate(new Date());
        Logtest logtest = feignService.feign10(logtest1);
        System.err.println(logtest.getDate().toLocaleString());
    }



}